{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 第四周作业：\n",
    "问题描述\n",
    "根据活动的关键词（count_1, count_2, ..., count_100，count_other属性）做聚类，可采用KMeans聚类，尝试K=10，20，30，..., 100, 并计算各自CH_scores。 \n",
    "\n",
    "解题提示\n",
    "文件说明： \n",
    "1. 可以先运行0. EDA.ipynb，看一下竞赛所有数据的情况； \n",
    "2. 总体活动的数目太多（300w+记录），可以只需对训练集train.csv和测试集test.cv出现的活动（13418条记录）举行聚类即可。运行1. Users_Events.ipynb可得到只在训练集train.csv和测试集test.cv出现的活动，可自己修改代码存为csv格式，在进行聚类。 \n",
    "\n",
    "批改标准\n",
    "1. 抽取出只在训练集和测试集中出现的event：20分 \n",
    "2. 聚类 ：40分 \n",
    "3. CH_scores计算：20分 \n",
    "4. 结果显示/分析：20分\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1、导入必要的工具包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "#保存数据\n",
    "import pickle\n",
    "import itertools\n",
    "import numpy as np\n",
    "import scipy.io as sio\n",
    "import scipy.sparse as ss\n",
    "from sklearn.preprocessing import normalize"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2、读取训练集和测试集中出现过的活动"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "总的数据条数： 13418\n",
      "<class 'dict'>\n"
     ]
    }
   ],
   "source": [
    "event_index=pickle.load(open(\"PE_eventIndex.pkl\",'rb'))\n",
    "event_num=len(event_index)\n",
    "print(\"总的数据条数：\",event_num)\n",
    "print(type(event_index))\n",
    "# print(event_index.keys())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3、从所有活动数据中把第2步中活动对应的词频特征筛选出来"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "events=open(\"events.csv\",'rb')\n",
    "events.readline() #去除第一行\n",
    "event_count_matrix=ss.dok_matrix((event_num,101))  #存储101个词频特征\n",
    "keys=event_index.keys() #获取活动的键。\n",
    "for line in events.readlines():\n",
    "    cols=line.strip().decode().split(\",\")\n",
    "    eventId=str(cols[0])  #拿到活动ID\n",
    "    if eventId in keys:\n",
    "        i=event_index[eventId]\n",
    "        for j in range(9,109):\n",
    "            event_count_matrix[i,j-9]=cols[j]\n",
    "events.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "event_count_matrix_nom=normalize(event_count_matrix,norm='l2')  #用l2归一化\n",
    "sio.mmwrite(\"event_count_matrix\",event_count_matrix_nom)  #保存到文件中"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4、对活动进行聚类，使用的KMeans方法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.cluster import KMeans\n",
    "from sklearn import metrics\n",
    "\n",
    "def K_cluster(k,data):\n",
    "    print(\"k值：\",k)\n",
    "    km=KMeans(n_clusters=k)  #KMeans聚类器\n",
    "    km.fit(data)\n",
    "    predict=km.predict(data)\n",
    "    \n",
    "    CH_score=metrics.silhouette_score(data,predict)  #评价指标\n",
    "    print(\"CH_score:\",CH_score)\n",
    "    return CH_score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "k值： 10\n",
      "CH_score: 0.16241406325472513\n",
      "k值： 20\n",
      "CH_score: 0.16231020983414607\n",
      "k值： 30\n",
      "CH_score: 0.15399874546518275\n",
      "k值： 40\n",
      "CH_score: 0.1597374174112157\n",
      "k值： 50\n",
      "CH_score: 0.1513696730537722\n",
      "k值： 60\n",
      "CH_score: 0.16260897536409408\n",
      "k值： 70\n",
      "CH_score: 0.16587244198554585\n",
      "k值： 80\n",
      "CH_score: 0.16719633093075079\n",
      "k值： 90\n",
      "CH_score: 0.1641429723520361\n",
      "k值： 100\n",
      "CH_score: 0.1642479955825395\n"
     ]
    }
   ],
   "source": [
    "CH_scores=[]\n",
    "ks=[i*10 for i in range(1,11)]  #所有的K值\n",
    "for k in ks:\n",
    "    score=K_cluster(k,event_count_matrix_nom)\n",
    "    CH_scores.append(score)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 使用MiniBatchKMeans聚类方法试一试"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "k值： 10\n",
      "CH_score: 0.1378973308943027\n",
      "k值： 20\n",
      "CH_score: 0.16186263719501975\n",
      "k值： 30\n",
      "CH_score: 0.15619074112615364\n",
      "k值： 40\n",
      "CH_score: 0.13634547869918062\n",
      "k值： 50\n",
      "CH_score: 0.08320548420592995\n",
      "k值： 60\n",
      "CH_score: 0.10860619853341527\n",
      "k值： 70\n",
      "CH_score: 0.12752855278893652\n",
      "k值： 80\n",
      "CH_score: 0.14918219057087934\n",
      "k值： 90\n",
      "CH_score: 0.1449626317210267\n",
      "k值： 100\n",
      "CH_score: 0.13679149712600433\n"
     ]
    }
   ],
   "source": [
    "from sklearn.cluster import MiniBatchKMeans\n",
    "\n",
    "def K_cluster(k,data):\n",
    "    print(\"k值：\",k)\n",
    "    km=MiniBatchKMeans(n_clusters=k)\n",
    "    km.fit(data)\n",
    "    predict=km.predict(data)\n",
    "    \n",
    "    CH_score=metrics.silhouette_score(data,predict)\n",
    "    print(\"CH_score:\",CH_score)\n",
    "    return CH_score\n",
    "\n",
    "CH_scores_mini=[]\n",
    "ks=[i*10 for i in range(1,11)]\n",
    "for k in ks:\n",
    "    score=K_cluster(k,event_count_matrix_nom)\n",
    "    CH_scores_mini.append(score)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "此方法较上一种方法聚类速度快，但是结果波动也比较大。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5、CH_scores计算得到的结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "KMeans的结果:\n",
      " [0.16241406325472513, 0.16231020983414607, 0.15399874546518275, 0.1597374174112157, 0.1513696730537722, 0.16260897536409408, 0.16587244198554585, 0.16719633093075079, 0.1641429723520361, 0.1642479955825395]\n",
      "MiniBatchKMeans的结果:\n",
      " [0.1378973308943027, 0.16186263719501975, 0.15619074112615364, 0.13634547869918062, 0.08320548420592995, 0.10860619853341527, 0.12752855278893652, 0.14918219057087934, 0.1449626317210267, 0.13679149712600433]\n"
     ]
    }
   ],
   "source": [
    "print(\"KMeans的结果:\\n\",CH_scores)\n",
    "print(\"MiniBatchKMeans的结果:\\n\",CH_scores_mini)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 6、结果显示和分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as pyplot\n",
    "%matplotlib inline\n",
    "# fig,(ax1,ax2) = pyplot.subplots(ncols=2)\n",
    "pyplot.plot(ks,np.array(CH_scores))\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "使用KMeans聚类\n",
    "最佳K值：80，CH_score：0.16719633093075079"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "pyplot.plot(ks,np.array(CH_scores_mini))\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "使用MiniBatchKMeans聚类\n",
    "最佳K值：20，CH_score：0.16186263719501975"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
